package com.zmn.oms.business.interfaces.work.masterwork;

import com.zmn.oms.common.dio.attachment.ModifyOrderWorkAttachmentDIO;
import com.zmn.oms.common.exception.OmsBaseException;
import com.zmn.oms.model.dto.log.CallRecordLogDTO;
import com.zmn.oms.model.dto.work.masterwork.*;
import com.zmn.oms.model.entity.work.OrderWork;
import com.zmn.oms.model.vo.work.OrderVisitQrCodeVO;

import java.util.Date;
import java.util.List;

/**
 * 类描述：工程师工单业务接口
 * @author heciqi
 * @date 2018/11/02 21:02
 */
public interface MasterWorkBService {

    /**
     * 工程师接单
     * @param masterTakeDTO
     * @param orderWork
     */
    void updateMasterTake(MasterTakeDTO masterTakeDTO, OrderWork orderWork) throws OmsBaseException;

    /**
     *  工程师出发
     * @param masterLevaeDTO
     * @return
     * @throws Exception
     */
    boolean updateMasterLeave(MasterLeaveDTO masterLevaeDTO) throws OmsBaseException;

    /**
     * 工程师上门
     * @param visitDTO
     */
    MasterVisitResponseDTO updateMasterVisit(MasterVisitDTO visitDTO, OrderWork orderWork) throws OmsBaseException;

    /**
     * 改价格
     * @param changePriceDTO
     */
    void updatePrice(ChangePriceDTO changePriceDTO) throws OmsBaseException;

    /**
     * 标记为使用配件
     * @param usePartDTO
     */
    void updateUsePart(UsePartDTO usePartDTO) throws OmsBaseException;

    /**
     * 修改纸质保单号
     * @param manualCodeDTO
     */
    void updateManualCode(ManualCodeDTO manualCodeDTO) throws OmsBaseException;

    /**
     * 工程师备注
     * @param masterRemarkDTO
     */
	void updateMasterRemark(MasterRemarkDTO masterRemarkDTO) throws OmsBaseException;

    /**
     * 发票信息
     * @param masterRemarkDTO
     */
    void updateInvoiceInfo(MasterRemarkDTO masterRemarkDTO) throws OmsBaseException;

    /**
     * 发票图片
     * @param masterRemarkDTO
     */
    void updateInvoicePic(MasterRemarkDTO masterRemarkDTO) throws OmsBaseException;

    /**
     * 贴花照片
     * @param orderImageDTO
     */
    void updateAppliqueImage(OrderImageDTO orderImageDTO) throws OmsBaseException;

    /**
     * 工单照片
     * @param orderImageDTO
     */
    void updateOrderImage(OrderImageDTO orderImageDTO) throws OmsBaseException;

    /**
     * 工单工程师照片
     * @param orderImageDTO
     */
    void updateMasterImage(OrderImageDTO orderImageDTO) throws OmsBaseException;

    /**
     * 图片地址转换
     */
    String convertUrls(String oldUrls, String newUrl, Integer opType, Integer index);

    /**
     * 检查工程师是否有未完成进行中工单
     * @param masterId
     */
    boolean checkWorkStatus(Integer masterId, Date startTime, Date endTime);

    /**
     * 检查工程师是否有未算账工单(区分返回值)
     * @param masterId
     */
    MasterWorkStatusDTO getMasterWorkStatus(Integer masterId, Date startTime, Date endTime);

    /**
     * 搜索进行中的工单
     *
     * @param masterId
     * @param queryText
     * @return
     * @throws OmsBaseException
     */
    WorkListDTO listDoingWorkByQuery(Integer masterId, String queryText) throws OmsBaseException;

    /**
     * 进行中工单
     * @param masterId
     */
    WorkListDTO getWorkingList(Integer masterId) throws OmsBaseException;

    /**
     * 改派中工单
     * @param masterId
     */
    List<WorkRedistributeListItemDTO> getRedistributingList(Integer masterId) throws OmsBaseException;


    /**
     * 完成工单列表
     * @param masterId
     * @see MasterWorkBService#listCompleteWorkFromEs
     */
    @Deprecated
    WorkListDTO getCompleteWorkListFromEs(Integer plat, Integer masterId, Date startDate, Date endDate, Integer startIndex, Integer pageSize);

    /**
     * 完成工单列表
     * @param masterId
     */
	List<WorkListItemDTO> listCompleteWorkFromEs(Integer plat, Integer masterId, Integer tapType, Date startDate,
												 Date endDate, Integer startIndex, Integer pageSize);

	/**
     * 工单详情
     * @param masterId
     */
    WorkDetailDTO getWorkDetail(Integer plat, Long orderId, Long workId, Integer masterId, Integer agent) throws OmsBaseException;

    WorkDetailDTO getWorkSimpleDetail(Integer plat, Long orderId, Long workId) throws OmsBaseException;

    /**
     * 历史工单详情
     * @param masterId
     */
    WorkDetailDTO getHisWorkDetail(Integer plat, Long orderId, Long workId, Integer masterId, Integer agent) throws OmsBaseException;

    /**
     * 工单完成
     * @param completeDTO
     * @return
     */
    void updateComplete(CompleteDTO completeDTO);

    /**
     * 记录工程师联系用户
     * @param contactUserDTO
     */
    void saveContactUser(ContactUserDTO contactUserDTO);

    /**
     * 更新联系时间
     * @param contactUserDTO
     */
    void updateContactTime(ContactUserDTO contactUserDTO);

    /**
     * 处理通话记录
     * @param contactUserDTO
     */
    CallRecordLogDTO processNormalCallRecord(ContactUserDTO contactUserDTO);

    /**
     * 判断工单是否确认过报价 用户确认过报价（后台报价默认为确认过报价，报价状态不能回滚）
     *
     * @param orderId
     * @return
     */
    boolean haveConfirmQuotation(Long orderId);

    /**
     * 工单报价显示相关
     *
     * @param orderWork
     */
    WorkQuotationShowDTO getQuotationShow(OrderWork orderWork);

    /**
     * 上门用户扫码
     * @param visitQrDTO
     */
    OrderVisitQrCodeVO visitUserQrCode(MasterVisitQrDTO visitQrDTO);

    /**
     * 用户扫码微信公众号
     * @param visitQrDTO
     */
    OrderVisitQrCodeVO userAttentionQrCode(MasterVisitQrDTO visitQrDTO);

    /**
     * 不校验库存
     * @param modifyDutyTimeDTO
     */
    void updateDutyTimeWithNoStock(ModifyDutyTimeDTO modifyDutyTimeDTO) throws OmsBaseException;

    /**
     * 修改预约时间
     * @param modifyDutyTimeDTO
     */
    void updateDutyTime(ModifyDutyTimeDTO modifyDutyTimeDTO) throws OmsBaseException;

    /**
     * 配件保留申请
     * @param masterPartRetainDTO
     */
	void updatePartRetain(MasterPartRetainDTO masterPartRetainDTO);

    /**
     * 发送用户支付消息
     * @param orderId
     * @param workId
     * @param payMsgType
     */
    boolean sendWaitPayNotice(Long orderId, Long workId, Integer payMsgType) throws OmsBaseException;

    /**
     * 发送用户支付消息
     * @param orderId
     * @param workId
     */
    boolean sendWaitPayNotice(Long orderId, Long workId, Long visitUserId, Long orderPayId);

    /**
     * 完成清洁服务
     * @param modifyOrderWorkAttachmentDIO
     */
    void completeCleanService(ModifyOrderWorkAttachmentDIO modifyOrderWorkAttachmentDIO) throws OmsBaseException;
}
